package april;

import com.sun.deploy.util.ArrayUtil;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author ：冯涛滔
 * @date ：Created in 2020-4-28 19:53
 * @description：
 * @modified By：
 * @version:
 */
public class April28 {
    /**
     * create by: 冯涛滔
     * description: https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
     * 1. 题目很清楚一个数字只会出现一次或者两次
     * 2. 用set存储 如果出现了并且set没有的存进去 有的就删除
     * 3. 最后就会只剩下两个
     * 这是不会异或的我的菜鸡 解法 有追求的推荐看看题解
     * create time: 2020-4-28 19:53
     * @params [nums]
     * @return int[]
     */
    public int[] singleNumbers(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; i++) {
            if(set.contains(nums[i])){
                set.remove(nums[i]);
            }else{
                set.add(nums[i]);
            }
        }
        Object[] objects = set.toArray();
        int[] res = new int[2];
        res[0] = (int) objects[0];
        res[1] = (int) objects[1];
        return res;
    }
    static class ListNode {
        int val;
        ListNode next;
        ListNode(){

        }
        ListNode(int x) { val = x; }
    }
    /**
     * create by: 冯涛滔
     * description: https://leetcode-cn.com/problems/add-two-numbers/submissions/
     * create time: 2020-4-28 21:11
     * @params [l1, l2]
     * 思路: 自己拿这个逆序的数组进行运算
     * 1. 两个节点相加起来+上次多出的除数%10 就是这个节点的值
     * 2. 除数就是 两个节点相加除以10
     * 3. 当某一个节点为空时就证明这个节点已经遍历完了 那么返回值节点只需要接上不为空的后续
     * 4. while循环 如果y>0 也就是还有一个除数没有被加进去的话就一直循环加进去
     * @return april.April28.ListNode
     */
    public static ListNode addTwoNumbers(ListNode l1, ListNode l2){
        ListNode a = new ListNode();
        int y = 0;//除数
        ListNode res = a;
        while(l1!=null||l2!=null){
            if(l1==null){
                res.next = l2.next;
                break;
            }
            if(l2==null){
                res.next = l1.next;
                break;
            }
            int number = l1.val+l2.val + y;
            res.val = number% 10 ;
            y = number/10;
            l1 = l1.next;
            l2 = l2.next;
            if(l1!=null&&l2!=null){ //如果还存在两个链表下一个数字
                res.next = new ListNode();
                res = res.next;

            }
        }
        while(y>0){
            if(res.next==null){
                res.next = new ListNode();
            }
            res = res.next;
            int val= res.val+y;
            res.val = val%10;
            y =  val/10;
            if(res.next==null&&y>0){
                res.next = new ListNode(y);
                break;//最后一个除数了
            }
        }
        return a;
    }

    public static void main(String[] args) {
        ListNode r = new ListNode(9);
        r.next = new ListNode(9);

        r.next.next = new ListNode(9);
        r.next.next.next = new ListNode(9);
        r.next.next.next.next = new ListNode(9);


        ListNode l  = new ListNode(1);
//        l.next = new ListNode(2);
        System.out.println(addTwoNumbers(r, l).val);
    }
}
